<html>
    <head>
        <title>AbpApplicationFactory类</title>
    </head>
    <body>
        <script>
            // 三、AbpApplicationFactory 类
                                /*
                                        AbpApplicationFactory 是创建ABP应用程序容器的"工厂类"。它提供了具有多个重载的单个静态 CreateAsync 方法。
                                        现在，让我们看看在什么情况下使用这些重载？

                                        1、第一个重载，获取一个通用模块类参数：
                                                    AbpApplicationFactory.CreateAsync<MyConsoleDemoModule>();
                                                泛型参数应该是当前应用程序的 "根模块类"。所有其他模块都被解析为该模块的依赖项。

                                        2、第二个重载,将根模块类的Type作为参数：
                                                    AbpApplicationFactory.CreateAsync(typeof(MyConsoleDemoModule));

                                        这两个重载的工作方式完全相同。因此二选一就好。


                                        如果你是用上述方法之一，ABP将会创建一个“内部服务集合” IserviceCollection 和 一个 "内部服务提供者" IServiceProvider，来在abp应用程序
                                        内部设置 "依赖注入系统"。
                                        请注意，我们使用了安装框架包部分中的application.ServiceProvider属性来解析依赖注入系统中的IEmailSender服务：

                                                using Microsoft.Extensions.DependencyInjection;
                                                using MyConsoleDemo;
                                                using Volo.Abp;

                                                // 1: 手动创建服务集合 IServiceCollection
                                                IServiceCollection services = new ServiceCollection();

                                                // 2: 创建ABP应用程序时，将 "服务集合" 传递给abp应用程序
                                                using var application = await AbpApplicationFactory
                                                    .CreateAsync<MyConsoleDemoModule>(services);

                                                // 3: 手动创建服务提供者对象（IOC容器） IServiceProvider
                                                IServiceProvider serviceProvider = services.BuildServiceProvider();

                                                // 4: 初始化abp应用程序时，将 "服务提供者对象" 传递给abp应用程序
                                                await application.InitializeAsync(serviceProvider);

                                                Console.WriteLine("ABP has been started...");

                                                await application.ShutdownAsync();   
                                                
                                        这里我们使用了 .net 的标准依赖注入容器:  services.BuildServiceProvider()创建标准服务容器(IOC容器)。
                                        但是，ABP提供了另一种扩展方法: BuildServiceProviderFromFactory()

                                        3、第三个重载，它将模块类名作为Type参数和IServiceCollection对象：
                                                            using var application = await AbpApplicationFactory
                                                            .CreateAsync(typeof(MyConsoleDemoModule), services);

                                            （所有 CreateAsynac方法重载都有Creat对应项。）
                                */
        </script>
    </body>
</html>